# 生成数据
import random
from alg import ListNode
import numpy as np

# 生成随机矩阵
def gen_matrix():
    row = random.choice(range(2,10)) # 行数随机 即建筑的数目随机
    col = 3 # 列数确定 x,y,t
    matrix = []
    x_seq = []

    for i in range(row):
        x_seq.append(random.choice(range(0,24))) # 从0~50中随机生成建筑物的左端

    sorted_x_seq = x_seq.sort() # 按照 x 排序

    if sorted_x_seq is None:
        pass
    else:
        return "排序失败"
    # 向随机矩阵中添加 x , y , t
    i = 0
    k = 0
    for i in range(row):
        m = []
        for j in range(col):
            if j == 0:
                m.append(x_seq[k]) # 向轮廓信息中添加左边缘坐标
                k += 1
            elif j == 1:
                m.append(random.choice(range(1,25))) # 向轮廓信息中添加右边缘坐标
            else:
                m.append(random.choice(range(2,15))) # 向轮廓信息中添加建筑高度信息
        matrix.append(m) # 向矩阵中添加单个建筑轮廓信息
    return matrix

# 天际线 输入样例1
buildings_1 = [[2,9,10],[3,7,15],[5,12,12],[15,20,10],[19,24,8]]
# 天际线 输入样例2
buildings_2 = [[0,2,3],[2,5,3]]

def generate_lengthOfLIS_data(n=50000, nk=100):
    k = random.randint(1, nk)
    nums = random.sample(range(1, n + nk + 1), n)
    return [nums, k]

def set_lengthOfLTS_data():
    data = []
    for i in range(10,50000,1000):
        data.append(generate_lengthOfLIS_data(i))
    return data

# 生成随机数列
def gen_list():
    nums1 = []
    nums2 = []
    m = random.choice(range(1, 2000))
    n = random.choice(range(1, 2000))
    # 生成两个随机有序数列 nums1 和 nums2
    for i in range(m):
        nums1.append(random.randint(1, 1000000))
    for i in range(n):
        nums2.append(random.randint(1, 1000000))

    lis = [sorted(nums1), sorted(nums2)]
    return lis

#生成一个随机的链表数组
#n为数组的链表个数
#m表示每个链表有一个0到m之间的随机节点数，每个结点有一个1到m之间的随机值
def generate_linked_list_array(n, m):
    arr = []#创建一个空链表来存储链表
    for i in range(n):#循环n次以创建n个链表
        head = ListNode(random.randint(1, m))#创建一个新的ListNode的对象，其值为1到m之间的随机值
        curr = head#设置当前结点为头结点
        for j in range(random.randint(0, m)):#循环创建随机数结点
            curr.next = ListNode(random.randint(1, m))#创建新的结点，将其设置为当前结点的下一个结点
            curr = curr.next
        arr.append(head)#将链表的头结点添加到数组中
    return arr#返回链表数组

n=random_number = random.randint(0, 20)
m=random_number = random.randint(0, 100)
arr=generate_linked_list_array(n, m)
#sort_linked_list_array接收一个链表数组arr，并返回一个新的数组，其中每个链表按升序排序
def sort_linked_list_array(arr):
    sorted_arr = []#创建一个空数组存储已排序的链表
    for head in arr:
        curr = head#将当前结点设置为链表的头
        vals = []#创建一个空数组来存储链表的值
        while curr:
            vals.append(curr.val)#添加vals数组中当前结点的值
            curr = curr.next#移动到下一个
        vals.sort()#对vals数组进行升序排序
        sorted_head = ListNode(vals[0])#用已排序的vals数组中的第一个值创建一个新的链表
        curr = sorted_head#设置头结点
        for val in vals[1:]:#遍历已排序的vals数组中的剩余值
            curr.next = ListNode(val)#将新结点添加到新的链表中
            curr = curr.next
        sorted_arr.append(sorted_head)#将排序后的链表添加到数组中
    return sorted_arr

def gen_nums():
    length=random.randint(1,20)
    nums=np.random.randint(1,50,length)
    return nums

def gen_lower():
    lower=random.randint(1,50)
    return lower

def gen_upper():
    upper=random.randint(gen_lower(),50)
    return upper

test_data = {
    "lengthOfLIS": set_lengthOfLTS_data(),
    "天际线 输入样例1":buildings_1,
    "天际线 输入样例2":buildings_2,
    "天际线随机数据":gen_matrix(),
    'median': gen_list(),
    'sort_lists': sort_linked_list_array(arr),
    'nums':gen_nums(),
    'lower':gen_lower(),
    'upper':gen_upper()
}
if __name__ == '__main__':
    print(test_data["lengthOfLIS"])
